import java.io.IOException;
import java.util.Scanner;

public class Main {
  /* LUOGU-5461 赦免战俘（分治、递归、IO优化）
   * 提交发现递归模拟在时间上也可以接受，C++容易通过。
   * 但Java版最后一个测试点TLE。考虑到在密集计算时，Java与C++差距不会太大。
   * 怀疑是IO耗时：去掉输出测试发现n=10时计算只需几十ms，IO需十几秒，调用print太多。
   * 于是改成在byte数组留出空格和换行，用write直接输出，IO提速明显。
   */
  static void pardon(byte[][] a, int rb, int cb, int w){
    int h = w / 2;
    for(int r = 0; r < h; ++r){ // 左上
      for(int c = 0; c < h; ++c){
        a[rb + r][cb + c * 2] = '0'; // 乘2是因为标志之间有空格。
      }
    }
    if(h < 2){
      return;
    }
    pardon(a, rb, cb + h * 2, h); // 右上
    pardon(a, rb + h, cb, h); // 左下
    pardon(a, rb + h, cb + h * 2, h); // 右下
  }

  public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    int n = s.nextInt(), w = (1 << n);
    byte[][] a = new byte[w][w * 2]; // 多分配一倍，添加空格直接输出。 
    for(int i = 0, w2 = w * 2; i < w; ++i){
      for(int j = 0; j < w2; ){
        a[i][j++] = '1'; // 先全填成'1'
        a[i][j++] = ' '; // 间隔空格
      }
    }
    pardon(a, 0, 0, w);
    try {
      for(int i = 0; i < w; ++i){
        a[i][w * 2 - 1] = '\n'; // 最后的空格改为换行。
        System.out.write(a[i]); // 每次输出一行。少了N倍调用，并且无需转换。
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
